perm filename CLIP2D.FAI[1,BGB] blob sn#001263 filedate 1972-10-22 generic text, type T, neo UTF8
00100	COMMENT /  SUTHERLAND & SPROUL HARDWARE CLIPPING ALGORITHM  -  ARGS X1,Y1,X2,Y2 EXTERN  -
00200			- RETURNS VALUES IN X1,Y1,X2,Y2 & FLAG  - FLAG TRUE IF LINE SEG SHOWING/
00300	TITLE CLIP2D
00400		INTERNAL CLIP2D;
00500		INTERNAL X1,Y1,X2,Y2,XL,YL,XH,YH,FLAG;
00550		X1: 0↔Y1: 0↔X2: 0↔Y2: 0↔XL: 0↔YL: 0↔XH: 0↔YH: 0↔FLAG: 0;
00600	; ACCUMULATORS
00700		XI←1;			INNER OR FIRST
00800		YI←2
00900		XO←3;			OUTER OR SECOND
01000		YO←4
01100		MX←5;			MIDPOINTS
01200		MY←6
01300		NX←7
01400		NY←8
01500		SKIPPER←9
01600		P←17
01700	
01800		DEFINE INSIDE(X,Y,L);		FALLS THRU IF TRUE
01900	{	CAMGE X,XL	↔	JRST L
02000	 	CAMLE X,XH	↔	JRST L
02100	 	CAMGE Y,YL	↔	JRST L
02200	 	CAMLE Y,YH	↔	JRST L}
02300	
02400		DEFINE OUTEASY(X1,Y1,X2,Y2,L);	JUMPS IF TRUE
02500	{	CAMGE X1,XH	↔	JRST .+3	↔	CAML X2,XH	↔	JRST L
02600	 	CAMGE Y1,YH	↔	JRST .+3	↔	CAML Y2,YH	↔	JRST L
02700	 	CAMLE X1,XL	↔	JRST .+3	↔	CAMG X2,XL	↔	JRST L
02800	 	CAMLE Y1,YL	↔	JRST .+3	↔	CAMG Y2,YL	↔	JRST L}
02900	
03000	CLIP2D:	SETOM	FLAG;		ASSUME DISPLAY UNTIL FOUND OTHERWISE
03100		MOVE	XI,X1;		ASSUME POINT1 INSIDE UNTIL FOUND OTHERWISE
03200		MOVE	YI,Y1
03300		MOVE	XO,X2;		ASSUME POINT2 OUTSIDE UNTIL FOUND OTHERWISE
03400		MOVE	YO,Y2
03500		OUTEASY(1,2,3,4,NOSHOW);	BOTH POINTS TO ONE SIDE OF THE WINDOW
03600		INSIDE(1,2,P1OUT);	JUMP IF POINT1 IS OUTSIDE
03700		INSIDE(3,4,P2OUT);	JUMP IF POINT2 IS OUTSIDE
03800		POPJ P,;		BOTH POINTS INSIDE OF WINDOW
03900	
04000	NOSHOW:	SETZM FLAG;			NO DISPLAY
04100		POPJ P,
04200	
04300	P1OUT:	INSIDE(3,4,BOTHOUT);	JUMP IF BOTH ARE OUTSIDE
04400		SETOM SKIPPER;			DISABLE POINT2 CONVERGENCE, IT'S NOT NEEDED.
04500		EXCH	XO,XI;		POINT 2 INSIDE, POINT 1 OUTSIDE
04600		EXCH	YO,YI
     

00100	DEFINE MIDPOINT {
00200		MOVE MX,XO;		COMPUTE MIDPOINT
00300		MOVE MY,YO
00400		ADD MX,XI
00500		ADD MY,YI
00600		ASH MX,-1
00700		ASH MY,-1}
00800	
00900	DEFINE CONVERGE {
01000		MOVE	XO;		TEST FOR CONVERGENCE
01100		SUB	XI
01200		MOVM
01300		SOJLE [	MOVE YO
01400			SUB  YI
01500			MOVM
01600			SOJLE .+25
01700			JRST .+1]
01800		MIDPOINT
01900	 	CAMGE MX,XL	↔	JRST .+12;	IS MIDPOINT INSIDE ?
02000	 	CAMLE MX,XH	↔	JRST .+10
02100	 	CAMGE MY,YL	↔	JRST .+6
02200	 	CAMLE MY,YH	↔	JRST .+4
02300		MOVE	XI,MX;		NEW MIDPOINT INSIDE
02400		MOVE	YI,MY
02500		JRST	.-24
02600		MOVE	XO,MX;		NEW MIDPOINT OUTSIDE
02700		MOVE	YO,MY
02800		JRST 	.-27}
02900	
03000	
03100	P1CONV:	CONVERGE
03200		MOVEM	XI,X1
03300		MOVEM	YI,Y1
03400		SKIPE	SKIPPER
03500		POPJ	P,
03600	
03700		MOVE	XO,X2;		SETUP TO FIND P2 ON A BOTH OUT CASE
03800		MOVE	YO,Y2
03900		MOVE	XI,NX
04000		MOVE	YI,NY
04100	
04200	P2OUT:	CONVERGE
04300		MOVEM	XI,X2
04400		MOVEM	YI,Y2
04500		POPJ	P,
     

00100	MIDOUT:	OUTEASY(1,2,MX,MY,MIDP1);	MIDPOINT OUTSIDE, SEE IF POINT1'S HALF IS EASY OUT.
00200		MOVE	3,MX;			MIDPOINT REPLACES POINT2
00300		MOVE	4,MY
00400	
00500	BOTHOUT:	MIDPOINT
00600		INSIDE(MX,MY,MIDOUT);
00700		SETZM	SKIPPER;		MIDPOINT INSIDE
00800		MOVEM	XO,X2;			SAVE POINT2
00900		MOVEM	YO,Y2
01000		MOVE	XO,XI;			SETUP  POINT1 OUTSIDE
01100		MOVE	YO,YI
01200		MOVEM	MX,NX;			COPY MIDPOINT
01300		MOVEM 	MY,NY;
01400		MOVE	XI,MX;			MIDPOINT INSIDE
01500		MOVE	YI,MY
01600		JRST	P1CONV;			CONVERGE ON EACH END
01700	
01800	MIDP1:	MOVE	1,MX;			MIDPOINT REPLACES POINT1
01900		MOVE	2,MY
02000		OUTEASY(MX,MY,3,4,NOSHOW);	SEE IF POINT2'S HALF IS EASY OUT.
02100		JRST	BOTHOUT
02200	
02300	END